package com.linkgie.galaxyframework.utils.service;

import com.linkgie.galaxyframework.utils.annotations.Name;

/**
 * ServiceProvider 命名服务包装器；
 * 
 * 维护对一个特定的命名服务实例的引用；
 * 
 * @author Hike
 *
 * @param <T> 命名服务的类型
 */
public final class ServiceProvider<T> {
	
	private final String name;

	private final String fullName;

	private final T service;


	/**
	 * 通过 {@link Name#value()} 标注的服务名；<p>
	 * 
	 * 如果服务未标注 {@link Name} ，则返回类的简短名称；
	 * 
	 * @return
	 */
	public String getAnnotatedName() {
		return name;
	}
	
	/**
	 * 服务实现类型的全名；
	 * 
	 * @return
	 */
	public String getFullName() {
		return fullName;
	}

	/**
	 * 服务实例；
	 * 
	 * @return
	 */
	public T getService() {
		return service;
	}
	
	private ServiceProvider(String name, T service, String fullName) {
		this.name = name;

		this.fullName = fullName;

		this.service = service;
	}
	
	public static <T> ServiceProvider<T> sigleton(T service){
		String fullName = service.getClass().getName();
		String name = null;
		Name annoNP = service.getClass().getAnnotation(Name.class);
		if (annoNP != null && annoNP.value() != null) {
			String n = annoNP.value().trim();
			if (n.length() > 0) {
				name = n;
			}
		}
		ServiceProvider<T> provider = new ServiceProvider<>(name, service, fullName);
		
		return provider;
	}
}
